<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /**
         * Promise 使用来解决异步回调的
         *      解决了么？ 
         *          解决了，但又没完全解决？
         */
        // let p = new Promise((resolve,reject)=>{
        //     setTimeout(()=>{
        //         resolve('ok');
        //     },1000);
        // })
        // // 从回调嵌套 ===> 回调函数的链式调用
        // p.then(value=>{

        // },reason=>{

        // })
        // .then(value=>{

        // })

        // 处理异步的终极目标===> 用同步的代码写异步程序！
        // async  await 就是来实现这一目标的终极解决方案！
        // async 修饰的函数，返回值一定是一个promise对象
        /**
         *  async 相当于是 new Promise
         *  async 函数返回值3种情况：
         *  1. 非promise：成功的promise， return的值就是成功的结果值
         *  2. throw xxx: 失败的promise， 并且xxx就是失败的结果值
         *  3. promise  : 你成功我成功，你失败我也失败
         * 
         *  async函数中可以没有await
         * 
         */
        async function fn() {

            // return 123;
            // return undefined;

            // throw 'error';

            // return Promise.resolve('ok');
            return Promise.reject('error');
        }

        // let result = fn();
        // console.log(result);
        // result.then(value=>{
        //     console.log(value);
        // })

        // await 相当于then，可以直接拿到成功promise对象的结果值
        // await 必须写在async函数的内部



        async function f1() {
            /**
             *  await相当于then
             *  1. await 必须写在async函数内
             *  2. await 后可以跟 非promise的值，那他的返回值就是 非promise的值  
             *  3. await 后面跟一个成功的promise，他可以直接拿到成功的结果值
             *  4. await 后面跟的是一个失败的promise. 就会报错，那如何处理失败的情况呢？使用try 。。。 catch 在catch中可以获得失败promise的结果值
             *  5. await 下面写的代码，都是异步的。相当于是 then 成功或失败回调函数中的代码。
             */
            // let result = await 123; // result => 123
            // try {
            //     let result = await new Promise((resolve, reject) => {
            //         setTimeout(() => {
            //             reject('ok');
            //         })
            //     })
            //     console.log('result', result);
            // } catch (e) {
            //     console.log('e',e);
            // }

            console.log(111);
            let result = await Promise.resolve('我是await');
            // await 下面的代码，都是异步的，相当于是 then 成功 失败回调函数中的代码
            console.log(222);
            console.log(333);
            console.log(444);
            let result2 = await Promise.resolve('ok');
            console.log(666);

        }
        f1();
        console.log(555);





    </script>
</body>

</html>